iT邦幫忙

2023 iThome 鐵人賽

DAY 7
0
SideProject30

HOW TO GO系列 第 7

07. Goroutine & Channel (1)

  • 分享至 

  • xImage
  •  

Goroutine 是 Go 其中非常重要的功能之一,既功能強大、容易使用且非常簡潔。

Go 使用 Goroutine 實現並行 (Coroutine) 這件事。其實現方式是在程式語言層級,相比於傳統於作業系統層級實現,耗用的系統資源較少,輕量不少。

Goroutine

使用方式很簡單,只需要在函數前方加上 go 關鍵字,該函數就是使用 Goroutine 執行

package main

import (
	"fmt"
	"time"
)

func main() {
	for i := 0; i < 5; i++ {
		go func(i int) {
			fmt.Printf("%d ", i)
		}(i)
	}
	// 等待 Goroutine 結束
	time.Sleep(1 * time.Second)
}

通道 (Channel)

每個 Goroutine 會是獨立運行的,當有需要傳遞變數時,就會使用到另一個功能通道 (Channel)。

Channel 作為 Goroutine 之間的通訊機制,分別為接收及發送兩項操作。

channel 是一種型別

// 宣告
var ch1 chan int
var ch2 chan bool
var ch3 chan []string
var ch3 chan MyStruct

// 初始化
ch1 = make(chan int, 10) // 有緩衝 channel
ch2 = make(chan bool, 20) // 有緩衝 channel
ch3 = make(chan []string) // 無緩衝 channel
ch4 = make(chan MyStruct, 5) // 有緩衝 channel

無緩衝 channel

package main

import (
	"fmt"
	"time"
)

func main() {
	// 簡單建立,被稱為無緩衝通道
	channel := make(chan string)

	go func() {
		// 模擬耗時操作
		time.Sleep(2 * time.Second)
		// 發送
		channel <- "Hello, Channel!"
	}()

	// 會造成 deadlock
	// channel <- "Again! Hello, Channel!"
	
	// 接收
	message := <-channel
	fmt.Println(message)
}

上一篇
06. 介面 (Interface)
下一篇
08. Goroutine & Channel (2)
系列文
HOW TO GO30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言